package com.example.demospringmybatisplus.soTokenController;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;

/**
 * Sa-Token踢人下线功能
 *
 * @author huahua
 * @DATE 2024/9/15
 **/
@RestController
@RequestMapping("/kickout/")
public class KickoutController {
    /*
     * 前提：首先调用登录接口进行登录
     * 		---- http://localhost:8086/acc/doLogin?name=zhangsan&pwd=zhangsan
     * 然后调用http://localhost:8086/user/findUsers，可以正常查询数据
     * 再调用指定账号注销方法http://localhost:8086/kickout/logout?userId=1
     * 最后调用http://localhost:8086/user/findUsers，提示"token 无效：5e9dfa60-8a70-4650-b42c-b569b1f96622"
     */

    // 将指定账号强制注销   ---- http://localhost:8086/kickout/logout?userId=1
    @RequestMapping("logout")
    public SaResult logout(long userId) {

        // 强制注销等价于对方主动调用了注销方法，再次访问会提示：Token无效。
        StpUtil.logout(userId);

        // 返回
        return SaResult.ok();
    }

    /**
     * 前提：首先调用登录接口进行登录
     * ---- http://localhost:8086/acc/doLogin?name=zhangsan&pwd=zhangsan
     * 然后调用http://localhost:8086/user/findUsers，可以正常查询数据
     * 再调用指定账号踢下线方法http://localhost:8086/kickout/kickout?userId=1
     * 最后调用http://localhost:8086/user/findUsers，提示"token 已被踢下线：5cfb03bf-c14a-43e8-b129-dc183a323ab5"
     *
     */
    // 将指定账号踢下线   ---- http://localhost:8086/kickout/kickout?userId=1
    @RequestMapping("kickout")
    public SaResult kickout(long userId) {

        // 踢人下线不会清除Token信息，而是将其打上特定标记，再次访问会提示：Token已被踢下线。
        StpUtil.kickout(userId);

        // 返回
        return SaResult.ok();
    }

    /*
     * 你可以分别在强制注销和踢人下线后，再次访问一下登录校验接口，对比一下两者返回的提示信息有何不同
     * 		---- http://localhost:8086/acc/checkLogin
     */

    // 根据 Token 值踢人    ---- http://localhost:8086/kickout/kickoutByTokenValue?tokenValue=xxxx-xxxx-xxxx-xxxx已登录账号的token值
    @RequestMapping("kickoutByTokenValue")
    public SaResult kickoutByTokenValue(String tokenValue) {

        StpUtil.kickoutByTokenValue(tokenValue);

        // 返回
        return SaResult.ok();
    }
}
